﻿using System;
using Business.Entity.Estoque.Produto;
using Business.Entity.Vendas.MovimentacaoCaixa.SubClass.RecebimentoVenda;
using Business.Enum;
using NHibernate;

namespace Business.Entity.Vendas.Pedido.Mercearia
{
    public class MerceariaRepository : RepositoryBase<Mercearia>
    {
        public static Mercearia Save(Mercearia pedido)
        {
            ISession session = SessionFactory.OpenSession();
            ITransaction transaction = session.BeginTransaction();
            try
            {
                
                pedido.Usuario = Utils.UsuarioAtual;
                session.Save(pedido);
                RepositoryBase<RecebimentoVenda>.Session = session;
                foreach (var pag in pedido.Pagamento)
                {
                    RepositoryBase<RecebimentoVenda>.Save(
                        RecebimentoVendaRepository.CreateRecebimentoVendaByPedido(pag));
                }
                
                EfetuarLancamentoMercearia(session, pedido);
                BaixaEstoque(session, pedido);
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw ex;
            }
            
            return pedido;
        }

        public static Boolean EfetuarLancamentoMercearia(ISession session, Vendas.Pedido.Mercearia.Mercearia pedido)
        {
            Session = session;

            foreach (var pag in pedido.Pagamento)
            {
                var fator = pag.ValorTotal / pedido.ValorPedido;
                var lanc = PedidoRepository.CriaLancamento(pedido, PedidoRepository.CriaHistorico(pedido));
                lanc.Valor = fator * pag.Valor;
                lanc.Desconto = pag.Desconto;
                lanc.Juros = pag.Juros;
                foreach (var prod in pedido.Produtos)
                {
                    PedidoRepository.DeterminarPartida(lanc, prod.Produto, pag.FormaPagamento);
                }
                if (!pag.FormaPagamento.AVista)
                {
                    PedidoRepository.LancaTitulo(pag);
                }
                Session.Save(lanc);
            }

            return true;
        }

        private static void BaixaEstoque(ISession session, Mercearia pedido)
        {
            foreach (var prods in pedido.Produtos)
            {
                if (prods.Produto.Ippt == Ippt.Propria)
                {
                    if (prods.Produto.Receitas.Count > 0)
                    {
                        foreach (var itemReceita in prods.Produto.Receitas)
                        {
                            var qtd = itemReceita.Quantidade * (prods.Quantidade *
                                      prods.Produto.UnidadeVenda.Quantidade);
                            ProdutoRepository.BaixarQuantidadeProduto(session, itemReceita.MateriaPrima, qtd);
                        }
                    }
                    else
                    {
                        ProdutoRepository.BaixarQuantidadeProduto(session, prods.Produto, prods.Quantidade);
                    }
                }
                else
                {
                    ProdutoRepository.BaixarQuantidadeProduto(session, prods.Produto, prods.Quantidade);
                }
                
            }
        }

        
    }
}
